home *** CD-ROM | disk | FTP | other *** search
/ Network PC / Network PC.iso / amiga utilities / communication / bbs / termv4.6 / extras / source / gtlayout-source.lha / LTP_DefaultEditRoutine.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-03-18  |  3.1 KB  |  184 lines

  1. /*
  2. **    GadTools layout toolkit
  3. **
  4. **    Copyright © 1993-1996 by Olaf `Olsen' Barthel
  5. **        Freely distributable.
  6. **
  7. **    :ts=4
  8. */
  9.  
  10. #ifndef _GTLAYOUT_GLOBAL_H
  11. #include "gtlayout_global.h"
  12. #endif
  13.  
  14. ULONG __saveds __asm
  15. LTP_DefaultEditRoutine(REG(a0) struct Hook *Hook,REG(a2) struct SGWork *Work,REG(a1) ULONG *Msg)
  16. {
  17.     LayoutHandle *Handle;
  18.     ObjectNode *Node;
  19.  
  20.     if(!GETOBJECT(Work->Gadget,Node))
  21.         return(TRUE);
  22.  
  23.     Handle = Hook->h_Data;
  24.  
  25.     if(*Msg == SGH_KEY)
  26.     {
  27.         struct Hook *Validate;
  28.  
  29.         if(Work->IEvent->ie_Code == 0x5F)
  30.         {
  31.             if(Handle->HelpHook)
  32.             {
  33.                 Work->Code        = 0x5F;
  34.                 Work->Actions    = (Work->Actions & ~SGA_BEEP) | SGA_END | SGA_USE;
  35.  
  36.                 LTP_AddHistory(Work);
  37.  
  38.                 return(TRUE);
  39.             }
  40.         }
  41.  
  42.         if(Work->IEvent->ie_Code == CURSORUP || Work->IEvent->ie_Code == CURSORDOWN)
  43.             LTP_HandleHistory(Work);
  44.  
  45.         if(Work->EditOp == EO_ENTER)
  46.         {
  47.             BOOL Activate = TRUE;
  48.  
  49.             DB(kprintf("enter operation\n"));
  50.  
  51.             if(Node->Type == STRING_KIND)
  52.             {
  53.                 if(Node->Special.String.LastGadget)
  54.                     Activate = FALSE;
  55.             }
  56. #ifndef DO_HEXHOOK
  57.             else
  58.             {
  59.                 if(Node->Type == INTEGER_KIND)
  60.                 {
  61.                     if(Node->Special.Integer.LastGadget)
  62.                         Activate = FALSE;
  63.                 }
  64.             }
  65. #endif
  66.  
  67.             if(!(Work->IEvent->ie_Qualifier & QUALIFIER_SHIFT))
  68.             {
  69.                 DB(kprintf("no shift\n"));
  70.  
  71.                 if(Activate && Handle->AutoActivate)
  72.                     Work->Actions |= SGA_NEXTACTIVE;
  73.  
  74.                 if(!(Work->Actions & SGA_NEXTACTIVE))
  75.                     Work->Code = '\r';
  76.             }
  77.             else
  78.                 DB(kprintf("has shift\n"));
  79.         }
  80.  
  81.         if(Work->IEvent->ie_Code == CURSORRIGHT && (Work->IEvent->ie_Qualifier & QUALIFIER_CONTROL))
  82.         {
  83.             if(Work->BufferPos != Work->NumChars)
  84.             {
  85.                 LONG i,Position = -1;
  86.  
  87.                 for(i = Work->BufferPos ; i < Work->NumChars ; i++)
  88.                 {
  89.                     if(Work->WorkBuffer[i] == ' ')
  90.                     {
  91.                         for( ; i < Work->NumChars ; i++)
  92.                         {
  93.                             if(Work->WorkBuffer[i] != ' ')
  94.                             {
  95.                                 Position = i;
  96.  
  97.                                 break;
  98.                             }
  99.                         }
  100.  
  101.                         break;
  102.                     }
  103.                 }
  104.  
  105.                 if(Position != -1)
  106.                     Work->BufferPos = Position;
  107.                 else
  108.                     Work->BufferPos = Work->NumChars;
  109.  
  110.                 Work->EditOp = EO_MOVECURSOR;
  111.             }
  112.         }
  113.  
  114.         if(Work->IEvent->ie_Code == CURSORLEFT && (Work->IEvent->ie_Qualifier & QUALIFIER_CONTROL))
  115.         {
  116.             if(Work->BufferPos)
  117.             {
  118.                 LONG i,Position = -1;
  119.  
  120.                 for(i = Work->BufferPos ; i >= 0 ; i--)
  121.                 {
  122.                     if(Work->WorkBuffer[i] != ' ')
  123.                     {
  124.                         Position = i;
  125.  
  126.                         break;
  127.                     }
  128.                 }
  129.  
  130.                 if(Position == -1)
  131.                     Position = 0;
  132.  
  133.                 if(Position)
  134.                 {
  135.                     i = Position;
  136.  
  137.                     Position = -1;
  138.  
  139.                     for( ; i >= 0 ; i--)
  140.                     {
  141.                         if(Work->WorkBuffer[i] == ' ')
  142.                         {
  143.                             Position = i + 1;
  144.  
  145.                             break;
  146.                         }
  147.                     }
  148.                 }
  149.  
  150.                 if(Position != -1)
  151.                     Work->BufferPos = Position;
  152.                 else
  153.                     Work->BufferPos = 0;
  154.  
  155.                 Work->EditOp = EO_MOVECURSOR;
  156.             }
  157.         }
  158.  
  159.         if(Node->Type == INTEGER_KIND)
  160.             Validate = Node->Special.Integer.ValidateHook;
  161.         else
  162.             Validate = Node->Special.String.ValidateHook;
  163.  
  164.         if(Validate)
  165.         {
  166.             if(!CallHookPkt(Validate,Work,Msg))
  167.             {
  168.                 Work->EditOp    = EO_BADFORMAT;
  169.                 Work->Actions    = SGA_BEEP;
  170.             }
  171.         }
  172.  
  173.         if(Work->Actions & SGA_END)
  174.             LTP_AddHistory(Work);
  175.     }
  176.     else
  177.     {
  178.         if(*Msg != SGH_CLICK)
  179.             return(FALSE);
  180.     }
  181.  
  182.     return(TRUE);
  183. }
  184.